# _*_coding : UTF-8_*_
import logging
import time
from selenium import webdriver
from selenium.webdriver import TouchActions
from selenium.webdriver.chrome.webdriver import WebDriver


class BasePage:
    """
    提供公共方法的封装，和页面逻辑无关的封装
    比如解决driver初始化

    #添加baseurl，可以支持测试用例灵活配置起始页
    #basepage完全和业务逻辑解耦
    #子类覆盖父类的类变量
    """
    _base_url="" # 加单下划线“_”变成私有属性，实例化后访问不了

    def __init__(self,baser_driver=None):
        # # 添加一个参数判断driver是否存在，解决实例化重复调用Base
        if baser_driver is None:
            # option=webdriver.ChromeOptions()
            # option.add_experimental_option('w3c',False)
            # self.driver = webdriver.Chrome(options=option)

            # # 复用浏览器
            # opt=webdriver.ChromeOptions()
            # opt.debugger_address = "127.0.0.1:9222"
            # self.driver = webdriver.Chrome(options=opt)

            self.driver = webdriver.Chrome()
            self.driver.get(self._base_url)
            self.driver.maximize_window()
            self.driver.implicitly_wait(6)  # 隐式等待，全局性
            time.sleep(6) # 强制等待，方便扫码
        #
        else:
            # self.driver添加一个WebDriver对象注解（selenium.webdriver.chrome.webdriver），解决类型提示问题
            # 注解本身没有任何的赋值作用，方便IDE操作,可以在继承该类下可以driver.关联出方法
            self.driver: WebDriver = baser_driver


    def find(self,by,locator=None):
        # 如果传入一个元组参数，解包传入
        if locator is None:
            logging.info(by)
            return self.driver.find_element(*by)
        # 适配多种传参情景
        else:
            logging.info(by,locator)
            return self.driver.find_element(by,value=locator)

    def get_TouchActions(self,text,x,y):
        """
        TochActions模拟PC和移动端的鼠标操作
        """
        action = TouchActions(self.driver)
        elemet=self.driver.find_element_by_link_text(text)
        return action.scroll_from_element(elemet, x, y).perform()

    def get_js(self,y):
        """
        js方法滚动下滑动
        """
        return self.driver.execute_script(f"document.documentElement.scrollTop={y}")